package com.thunisoft.lambda.bean;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.LongSummaryStatistics;
import java.util.Map;
import java.util.stream.Collectors;

import org.springframework.util.StringUtils;

/**
 * @title TestApp.java
 * @package com.thunisoft.lambda.bean
 * @projectName spring.boot
 * @author yzj 
 * @date 2019年6月25日 下午6:01:00
 */
public class TestApp {

    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        Person p1 = new Person("张1",1,1);
        Person p101 = new Person("张101",101,101);
        Person p2 = new Person("张2",3,2);
        Person p3 = new Person("张3",3,3);
        Person p4 = new Person("张4",4,4);
        Person p5 = new Person("2323",5,5);
        Person p6 = new Person("张6",6,6);
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
        list.add(p5);
        list.add(p6);
        list.add(p101);
        System.out.println(list);
        List<Person> list2=new ArrayList<>();
        
        Person p7 = new Person("张7",7,7);
        list2.add(p7);
        list.stream().filter(item->!StringUtils.isEmpty(item.getName())).collect(Collectors.toList()).forEach(item2->list2.add(item2));
        System.out.println(list2);
        List<Person> aaa = list.stream().filter(item->StringUtils.isEmpty(item.getName())).collect(Collectors.toList());
        System.out.println("====="+aaa);
        
        List<String> ccc = list.stream().filter(item->item.getAge()>3).map(Person::getName).collect(Collectors.toList());
        System.err.println(ccc);

        /**
         * 1.forEach()进行遍历集合
         *    item：可以是任意值。类似于for循环中的循环值
         */
        StringBuilder pmdzBuffer = new StringBuilder();
        list.forEach(item->{
            //设置值
            item.setName(item.getName()+"测试");
            pmdzBuffer.append(item.getName());
            //输出语句
            System.out.println(item.toString());
        });
        System.err.println(pmdzBuffer.toString());
        
        /**
         * 2.stream()流操作
         */
        //2.1. 去重 distinct() 去重；collect(Collectors.toList())。封装成集合
        List<Person> distinctList = list.stream().distinct().collect(Collectors.toList());
        //2.2 排序  sorted((第一个对象，第二个对象)->返回值)  （升降序看是第几个对象与第几个对象比较）
        List<Person> sortedList = list.stream().sorted((o1,o2)->o1.getAge()-o2.getAge()).collect(Collectors.toList());
        //2.3 过滤 ， filter(item->{})   item为每一项。 按照自己的需求来筛选list中的数据
        List<Person> filterList = list.stream().filter(item->item.getAge()>3).collect(Collectors.toList());
        //2.4 map(), 提取对象中的某一元素.  用每一项来获得属性（也可以直接用  对象::get属性()）
        List<String> mapList1 = list.stream().map(Person::getName).collect(Collectors.toList());
        List<String> mapList2 = list.stream().map(item->item.getName()).collect(Collectors.toList());
        //2.5 统计 sum() 。mapToDouble() 转换成double。还有其他类型转换。可以自己研究。
        //           max(),min(),average()
        double sum = list.stream().mapToDouble(Person::getAge).sum();
        //2.6 分组   Collectors.groupingBy(属性名)
        Map<Integer, List<Person>> map = list.stream().collect(Collectors.groupingBy(Person::getAge));
        
        System.out.println("groupingByage"+map);
        //2.7 多重分组 Collectors.groupingBy(属性，Collectors.groupingBy(属性))
        Map<String, Map<Integer, List<Person>>> map2 = list.stream().collect(Collectors.groupingBy(t->t.getName(),Collectors.groupingBy(t->t.getAge())));
        //2.8 分组并计算综合        Collectors.summarizingLong()
        Map<String, Map<Integer, LongSummaryStatistics>> map3 = list.stream().collect(Collectors.groupingBy(t->t.getName(),Collectors.groupingBy(t->t.getAge(),Collectors.summarizingLong(Person::getSize))));
        
        /**
         *  3.  集合比较的简写方式
         */
        list.sort((o1,o2)->{return o1.getAge()-o2.getAge();});
        
        
        
        String bbb="12,33,44,55,";
        System.out.println(bbb.substring(0, bbb.lastIndexOf(',')));
        
        
        
        Map<String , String> map4=new HashMap<>();
        map4.put("key1", "value1");
        map4.put("key2", "value2");
        map4.put("key3", "value3");
        map4.forEach((k,v)->{
        	System.out.println(k+":"+v);
        });
        
        System.out.println(map4.computeIfAbsent("key5", k->"test"));
    }
}
